type calculateFn = (arg1: string | number, arg2: string | number) => number;
// 乘
export const accMul: calculateFn = (arg1, arg2) => {
	let m = 0;
	m += deal(arg1);
	m += deal(arg2);
	let r1 = Number(arg1.toString().replace(".", ""));
	let r2 = Number(arg2.toString().replace(".", ""));
	return (r1 * r2) / Math.pow(10, m);
};
// 求小数点后的数据长度
export const deal = (arg: string | number) => {
	let t = 0;
	try {
		t = arg.toString().split(".")[1].length;
	} catch (e) { }
	return t;
};
// 除
export const accDiv: calculateFn = (arg1, arg2) => {
	var t1 = deal(arg1);
	var t2 = deal(arg2);
	var r1 = Number(arg1.toString().replace(".", ""));
	var r2 = Number(arg2.toString().replace(".", ""));
	return (r1 / r2) * Math.pow(10, t2 - t1);
};
// 加
export const accAdd: calculateFn = (arg1, arg2) => {
	let r1 = deal(arg1);
	let r2 = deal(arg2);
	let m = Math.pow(10, Math.max(r1, r2));
	return (accMul(arg1, m) + accMul(arg2, m)) / m;
};
/**
 * 数字整除或整乘，即小数点左移或右移
 * @param {number|string} num: 数值
 * @param {number} digit: 小数点移动的位数
 * @returns string
 */
export const accCount = (num: string | number, digit: number = 0) => {
	// 字符串中间拼接e表示小数点移动digit位，整数右移，负数左移
	return +`${num}e${digit}`
};
/**
 * 保留小数点几位数, 自动补零, 四舍五入
 * @param {number|string} num: 数值
 * @param {number} digit: 小数点后位数
 * @param {boolean} isRound: 是否四舍五入
 * @returns string
 */
export const numToFixed = (num: string | number, digit: number = 0, isRound: boolean = false) => {
	if (Object.is(parseFloat(`${num}`), NaN)) {
		console.error(`传入的值：${num}不是一个数字`);
		num = 0
	}
	if (isRound) {
		return parseFloat(`${num}`).toFixed(digit)
	}
	
	// 保留几位小数点，就先加上几个0
	// 字符串中间拼接e表示小数点移动digit位，整数右移，负数左移
	let result = +`${num.toString() + new Array(digit).map(() => '0').join('')}e${digit}`;
	result = Math.trunc(result)
	return +`${result}e${-digit}`;
};
/**
 * @description 数字格式化
 * @param {number|string} number 要格式化的数字
 * @param {number} decimals 保留几位小数
 * @param {string} decimalPoint 小数点符号
 * @param {string} thousandsSeparator 千分位符号
 * @returns {string} 格式化后的数字
 */
export const priceFormat = (number: string | number, decimals: number = 0, decimalPoint: string = '.', thousandsSeparator: string|boolean = ','): string => {
	const prec = !isFinite(+decimals) ? 0 : Math.abs(decimals)
	let s = `${numToFixed(number, decimals, false)}`.split('.')

	if(thousandsSeparator){
		const re = /(-?\d+)(\d{3})/
		while (re.test(s[0])) {
			s[0] = s[0].replace(re, `$1${thousandsSeparator}$2`)
		}
	}
	

	if ((s[1] || '').length < prec) {
		s[1] = s[1] || ''
		s[1] += new Array(prec - s[1].length + 1).join('0')
	}
	return s.join(decimalPoint)
}

/**
 * @description 字符串转数字，将其中的非数字过滤掉
 * @param {string} str 要转换的内容
 * @returns {string} 转换后的数字
 */
export const stringToNumber = (str:string): string => {
	// 正则依次为仅允许数字和小数点，第一位不能为小数点，只能存在一个小数点，如果第一位为0，则第二位必须为小数点
	return str.replace(/[^\d.]/g,'').replace(/^\./g, '').replace(/^0(?!\.|$)(.*)/, '$1').replace('.', '$#$').replace(/\./g, '').replace('$#$',
	'.')
}

/**
 * @description 数字保留两位小数
 * @param {number|string} number 要格式化的数字
 * @returns {string} 格式化后的数字
 */
export const numberKeepTwoDecimal = (number:string|number): string => {
	return `${number}`.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3')
}
/**
 * @description 数字添加单位
 * @param {number|string} number 要格式化的数字
 * @param {number} max 	 		 单位值，即
 * @param {string} unit 	 	 添加的单位
 * @returns {string} 格式化后的数字
 */
export const numberAddUnit = (number:string|number,max:number,unit:string): string => {
	let num = Number(number)
	if (num >= max) {
		return `${Math.floor(num / max).toLocaleString() + unit}`
	}
	return `${number}`
}

/**
 * @description 如果value小于min，取min；如果value大于max，取max
 * @param {number} min
 * @param {number} max
 * @param {number} value
 * @returns {number} 
 */
export const numberRandom = (min: number = 0, max: number = 0, value: number|string = 0): number => {
	return Math.max(min, Math.min(max, Number(value)));
};

/**
 * @description 如果value小于min，取min；如果value大于max，取max
 * @param {number} value
 * @returns {string} 
 */
export const numberFormatter = (value: string | number):string => `${value}`.replace(/[^0-9.]/g, '')